#include "hashtable.h"

namespace HashBucket
{


    template<class K, class Hash = MyHashFunc::MyHash<K>>
    class unordered_set
    {
        struct KeyOfValue
        {
            const K &operator()(const K &key)
            {
                return key;
            }
        };


    public:
        typedef HashTable<K, K, KeyOfValue, Hash> HT;
        typedef typename HashBucket::HashTable<K, K, KeyOfValue, Hash>::const_Iterator Iterator;
        typedef typename HashBucket::HashTable<K, K, KeyOfValue, Hash>::const_Iterator const_Iterator;


        Iterator begin()
        {
            return _ht.begin();            
        }

        const_Iterator begin() const 
        {
            return _ht.begin();
        }

        Iterator end()
        {
            return _ht.end();
        }
        
        const_Iterator end() const 
        {
            return _ht.end();
        }

        pair<Iterator, bool> Insert(const K &data)
        {
            return _ht.Insert(data);
        }

        void Order()
        {
            _ht.Order();
        }



    private:
        HT _ht;

    public:

        static void Test1()
        {
            HashBucket::unordered_set<int> st;
            st.Insert(1);
            st.Insert(12);
            st.Insert(13);
            st.Insert(14);
            st.Insert(15);
            st.Insert(16);
            st.Insert(17);
            st.Insert(18);
            st.Insert(19);
            st.Insert(122);

            st.Order();
        }
        

        static void Test2()
        {
            HashBucket::unordered_set<int> st;
            st.Insert(1);
            st.Insert(12);
            st.Insert(13);
            st.Insert(14);
            st.Insert(15);
            st.Insert(16);
            st.Insert(17);
            st.Insert(18);
            st.Insert(19);
            st.Insert(122);

            HashBucket::unordered_set<int>::Iterator it = st.begin();

            while (it != st.end())
            {
                cout << (*it) << " ";
                ++it;
            }
        }
    };



};